home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_11 / saks / queue7.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-08  |  1.4 KB  |  81 lines

  1. Listing 4 - macro definitions for instantiating a type-specific wrapper
  2. around a generic queue of void *
  3.  
  4. //
  5. // queue7.h - macros for instantiating a wrapper
  6. // for a generic queue of void * with an iterator
  7. //
  8.  
  9. #include "generic.h"
  10. #include "genq7.h"
  11.  
  12. #define queue(T) name2(T, _queue)
  13.  
  14. //
  15. // queuedeclare
  16. //
  17. #define queuedeclare(T) \
  18. class queue(T) \
  19.     { \
  20. public: \
  21.     ~queue(T)(); \
  22.     void append(const T &e); \
  23.     void clear(); \
  24.     int remove(T &e); \
  25.     class iterator; \
  26.     friend class iterator; \
  27.     class iterator \
  28.         { \
  29.     public: \
  30.         iterator(queue(T) &q); \
  31.         T *next(); \
  32.     private: \
  33.         genq::iterator gqi; \
  34.         }; \
  35. private: \
  36.     genq gq; \
  37.     }; \
  38. \
  39. inline queue(T)::iterator::iterator(queue(T) &q) \
  40.     : gqi(q.gq) \
  41.     { \
  42.     } \
  43. \
  44. inline T *queue(T)::iterator::next() \
  45.     { \
  46.     return (T *)gqi.next(); \
  47.     } \
  48. \
  49. inline queue(T)::~queue(T)() \
  50.     { \
  51.     clear(); \
  52.     } \
  53. \
  54. inline void queue(T)::append(const T &e) \
  55.     { \
  56.     gq.append(new T (e)); \
  57.     }
  58.  
  59. //
  60. // queueimplement
  61. //
  62. #define queueimplement(T) \
  63. void queue(T)::clear() \
  64.     { \
  65.     void *p; \
  66.     while (gq.remove(p)) \
  67.         delete (T *)p; \
  68.     } \
  69. \
  70. int queue(T)::remove(T &e) \
  71.     { \
  72.     void *p; \
  73.     int rv = gq.remove(p); \
  74.     if (rv) \
  75.         { \
  76.         e = *(T *)p; \
  77.         delete (T *)p; \
  78.         } \
  79.     return rv; \
  80.     }
  81.